/*
 * @Description:
 * @Version: V1.0.0
 * @Author: liuxiaonan
 * @Date: 2023-11-17 14:19:39
 * @LastEditors: 刘逍男 178111805@qq.com
 * @LastEditTime: 2023-11-22 14:21:51
 * @FilePath: \electron-base\main.js
 */
const path = require("path");
const { app, BrowserWindow, ipcMain, dialog, globalShortcut, Menu, desktopCapturer,nativeImage } = require("electron");
//主菜单
const mainMenu = require('./mainMenu')
const createTray = require('./tray')
//上下文菜单
let contextMenu = Menu.buildFromTemplate([
    { label: 'Item 1' },
    { role: 'editMenu' }
])
//保存窗口状态
const WinState = require("electron-win-state").default;

const createWindow = () => {
    const winState = new WinState({
        defaultWidth: 800,
        defaultHeight: 600,
    });
    //构建浏览器窗口  原生窗口
    const win = new BrowserWindow({
        ...winState.winOptions,
        // icon:'./start.png',
        icon:nativeImage.createFromPath('Base.png').resize({
            width:'16px',
            height:'16px'
        }),
        //设置winState后，要把下面宽高x,y注释掉，否则会覆盖
        // width: 1000,
        // height: 800,
        // x: 100,
        // y: 100,
        // frame:false,//隐藏标题栏，不能拖动窗口了  内容全部铺满  可配合app.css做窗口拖动效果
        // titleBarStyle:'hidden',//显示红绿灯
        //对于一个复杂的应用，ready-to-show 可能发出的太晚，会让应用感觉缓慢。 在这种情况下，建议立刻显示窗口，并使用接近应用程序背景的 backgroundColor
        // backgroundColor: 'red',
        // show: false,//优雅的方式打开页面，先下载页面，页面加载完后再打开窗口  配合下面ready-to-show方法使用
        // minimizable:false,
        // autoHideMenuBar:true,//自动隐藏菜单栏 除非按了Alt键
        webPreferences: {
            //集成node  一般不用
            // nodeIntegration:true,
            //上下文隔离关闭（主进程和渲染进程打通）  一般不用
            // contextIsolation:false
            preload: path.resolve(__dirname, "./preload.js"),
            //20版本之后默认开启沙盒模式
            sandbox: false,
        },
    });
    winState.manage(win)


    // win.loadURL('http://www.baidu.com')  引用线上的地址
    win.loadFile("./index.html"); //引用本地的地址
    // win.loadURL("https://github.com");
    // win.once("ready-to-show", () => {
    //     win.show();
    // });
    // const win2 = new BrowserWindow({
    //     width: 600,
    //     height: 400,
    //     parent:win,//父子窗口  父窗口移动子窗口移动（子窗口可以单独移动）
    //     modal:true //模态窗口  父窗口移动子窗口移动（子窗口不可以单独移动）
    // })
    // win2.loadURL("https://www.baidu.com");
    //打开开发者工具
    const wc = win.webContents;
    // wc.openDevTools();
    //在主进程中监测页面的资源是否加载完毕
    wc.on('did-finish-load', () => {
        console.log('finish')
    })
    //当顶级 frame 的 document 被加载完时触发。
    wc.on('dom-ready', () => {
        console.log('ready')
    })
    //右键打开菜单  比如右击图片 保存
    wc.on('context-menu', (e, params) => {
        contextMenu.popup()
        // console.log('content-menu',params)
        // 注入js代码
        // wc.executeJavaScript(`alert('${params.selectionText}')`)
        //打开一个对话框 可以选择文件
        // dialog.showOpenDialog(win, {
        //     buttonLabel:'选择',
        //     defaultPath:app.getPath('desktop'),
        //     properties: ['multiSelections','openFile', 'openDirectory','promptToCreate']
        // }).then(result => {
        //     console.log(123,result.canceled)//是否 取消 操作，取消：true，反之：false
        //     console.log(456,result.filePaths)//返回所有选中文件夹的路径
        // }).catch(err => {
        //     console.log(err)
        // })
        //保存窗口
        // dialog.showSaveDialog({}).then(result => {
        //     console.log(result.filePath)
        // })
        //Message提示框
        // const answers = ['Yes','No','Maybe']
        // dialog.showMessageBox({
        //     title:'MessageBox',
        //     type:'error',
        //     message:'Please select an option',
        //     detail:'Message details',
        //     buttons:answers
        // }).then(({response})=>{
        //     console.log(`User selected:${answers[response]}`)
        // })
    })
    Menu.setApplicationMenu(mainMenu('我的消息窗口', (args) => {
        console.log(args)
    }))
    //快捷键
    // globalShortcut.register('G', () => {
    //     console.log('G')
    // })
    //注销快捷键
    // globalShortcut.unregister('CommandOrControl+X')
    //创建托盘
    createTray(app, win)
    //抓取屏幕
    ipcMain.handle('capture-event',async (e,args) => {
        return desktopCapturer.getSources({ types: ['window', 'screen'] }).then((sources) => {
            return sources;
        })
    })
};
//检测窗口的关闭   最后一个窗口
app.on("window-all-closed", () => {
    //对于macOS系统   关闭窗口时，不会直接退出应用
    // darwin mac系统名字
    if (process.platform !== "darwin") app.quit();
});
console.log(app.getPreferredSystemLanguages())
//窗口关闭前的一些处理工作  给用户一些提醒  如果应用程序因系统关机/重启或用户注销而关闭，那么这个事件不会被触发。
app.on("before-quit", () => {
    console.log("App is quiting");
});
// 当一个 browserWindow 失去焦点时触发。  检测浏览器是否被放到后台里面了
// app.on('browser-window-blur',()=>{
//     console.log('browser-window-blur')
//     setTimeout(()=>{
//         app.quit()
//     },3000)
// })
// 当一个 browserWindow 获得焦点时触发。   检测浏览器是否被放到后台里面了
// app.on('browser-window-focus',()=>{
//     console.log('browser-window-focus')
// })

app.whenReady().then(() => {
    createWindow();
    app.on("activate", () => {
        // getAllWindows // 静态方法 所有打开的窗口的数组
        if (BrowserWindow.getAllWindows().length === 0) createWindow();
    });
    // console.log(app.getPath('desktop'))  /Users/macos/Desktop
});
//主进程与渲染进程通信
//可做异步操作也可做同步操作
ipcMain.handle("send-event", async (event, msg) => {
    return msg;
});
